home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / javax / smartcardio / CommandAPDU.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  3.9 KB  |  261 lines

  1. package javax.smartcardio;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.Serializable;
  6. import java.nio.ByteBuffer;
  7. import java.util.Arrays;
  8.  
  9. public final class CommandAPDU implements Serializable {
  10.    private static final long serialVersionUID = 398698301286670877L;
  11.    private static final int MAX_APDU_SIZE = 65544;
  12.    private byte[] apdu;
  13.    // $FF: renamed from: nc int
  14.    private transient int field_0;
  15.    // $FF: renamed from: ne int
  16.    private transient int field_1;
  17.    private transient int dataOffset;
  18.  
  19.    public CommandAPDU(byte[] var1) {
  20.       this.apdu = (byte[])(([B)var1).clone();
  21.       this.parse();
  22.    }
  23.  
  24.    public CommandAPDU(byte[] var1, int var2, int var3) {
  25.       this.checkArrayBounds(var1, var2, var3);
  26.       this.apdu = new byte[var3];
  27.       System.arraycopy(var1, var2, this.apdu, 0, var3);
  28.       this.parse();
  29.    }
  30.  
  31.    private void checkArrayBounds(byte[] var1, int var2, int var3) {
  32.       if (var2 >= 0 && var3 >= 0) {
  33.          if (var1 == null) {
  34.             if (var2 != 0 && var3 != 0) {
  35.                throw new IllegalArgumentException("offset and length must be 0 if array is null");
  36.             }
  37.          } else if (var2 > var1.length - var3) {
  38.             throw new IllegalArgumentException("Offset plus length exceed array size");
  39.          }
  40.  
  41.       } else {
  42.          throw new IllegalArgumentException("Offset and length must not be negative");
  43.       }
  44.    }
  45.  
  46.    public CommandAPDU(ByteBuffer var1) {
  47.       this.apdu = new byte[var1.remaining()];
  48.       var1.get(this.apdu);
  49.       this.parse();
  50.    }
  51.  
  52.    public CommandAPDU(int var1, int var2, int var3, int var4) {
  53.       this(var1, var2, var3, var4, (byte[])null, 0, 0, 0);
  54.    }
  55.  
  56.    public CommandAPDU(int var1, int var2, int var3, int var4, int var5) {
  57.       this(var1, var2, var3, var4, (byte[])null, 0, 0, var5);
  58.    }
  59.  
  60.    public CommandAPDU(int var1, int var2, int var3, int var4, byte[] var5) {
  61.       this(var1, var2, var3, var4, var5, 0, arrayLength(var5), 0);
  62.    }
  63.  
  64.    public CommandAPDU(int var1, int var2, int var3, int var4, byte[] var5, int var6, int var7) {
  65.       this(var1, var2, var3, var4, var5, var6, var7, 0);
  66.    }
  67.  
  68.    public CommandAPDU(int var1, int var2, int var3, int var4, byte[] var5, int var6) {
  69.       this(var1, var2, var3, var4, var5, 0, arrayLength(var5), var6);
  70.    }
  71.  
  72.    private static int arrayLength(byte[] var0) {
  73.       return var0 != null ? var0.length : 0;
  74.    }
  75.  
  76.    private void parse() {
  77.       if (this.apdu.length < 4) {
  78.          throw new IllegalArgumentException("apdu must be at least 4 bytes long");
  79.       } else if (this.apdu.length != 4) {
  80.          int var1 = this.apdu[4] & 255;
  81.          if (this.apdu.length == 5) {
  82.             this.field_1 = var1 == 0 ? 256 : var1;
  83.          } else if (var1 != 0) {
  84.             if (this.apdu.length == 5 + var1) {
  85.                this.field_0 = var1;
  86.                this.dataOffset = 5;
  87.             } else if (this.apdu.length == 6 + var1) {
  88.                this.field_0 = var1;
  89.                this.dataOffset = 5;
  90.                int var5 = this.apdu[this.apdu.length - 1] & 255;
  91.                this.field_1 = var5 == 0 ? 256 : var5;
  92.             } else {
  93.                throw new IllegalArgumentException("Invalid APDU: length=" + this.apdu.length + ", b1=" + var1);
  94.             }
  95.          } else if (this.apdu.length < 7) {
  96.             throw new IllegalArgumentException("Invalid APDU: length=" + this.apdu.length + ", b1=" + var1);
  97.          } else {
  98.             int var2 = (this.apdu[5] & 255) << 8 | this.apdu[6] & 255;
  99.             if (this.apdu.length == 7) {
  100.                this.field_1 = var2 == 0 ? 65536 : var2;
  101.             } else if (var2 == 0) {
  102.                throw new IllegalArgumentException("Invalid APDU: length=" + this.apdu.length + ", b1=" + var1 + ", b2||b3=" + var2);
  103.             } else if (this.apdu.length == 7 + var2) {
  104.                this.field_0 = var2;
  105.                this.dataOffset = 7;
  106.             } else if (this.apdu.length == 9 + var2) {
  107.                this.field_0 = var2;
  108.                this.dataOffset = 7;
  109.                int var3 = this.apdu.length - 2;
  110.                int var4 = (this.apdu[var3] & 255) << 8 | this.apdu[var3 + 1] & 255;
  111.                this.field_1 = var4 == 0 ? 65536 : var4;
  112.             } else {
  113.                throw new IllegalArgumentException("Invalid APDU: length=" + this.apdu.length + ", b1=" + var1 + ", b2||b3=" + var2);
  114.             }
  115.          }
  116.       }
  117.    }
  118.  
  119.    public CommandAPDU(int var1, int var2, int var3, int var4, byte[] var5, int var6, int var7, int var8) {
  120.       this.checkArrayBounds(var5, var6, var7);
  121.       if (var7 > 65535) {
  122.          throw new IllegalArgumentException("dataLength is too large");
  123.       } else if (var8 < 0) {
  124.          throw new IllegalArgumentException("ne must not be negative");
  125.       } else if (var8 > 65536) {
  126.          throw new IllegalArgumentException("ne is too large");
  127.       } else {
  128.          this.field_1 = var8;
  129.          this.field_0 = var7;
  130.          if (var7 == 0) {
  131.             if (var8 == 0) {
  132.                this.apdu = new byte[4];
  133.                this.setHeader(var1, var2, var3, var4);
  134.             } else if (var8 <= 256) {
  135.                byte var9 = var8 != 256 ? (byte)var8 : 0;
  136.                this.apdu = new byte[5];
  137.                this.setHeader(var1, var2, var3, var4);
  138.                this.apdu[4] = var9;
  139.             } else {
  140.                byte var10;
  141.                byte var11;
  142.                if (var8 == 65536) {
  143.                   var11 = 0;
  144.                   var10 = 0;
  145.                } else {
  146.                   var11 = (byte)(var8 >> 8);
  147.                   var10 = (byte)var8;
  148.                }
  149.  
  150.                this.apdu = new byte[7];
  151.                this.setHeader(var1, var2, var3, var4);
  152.                this.apdu[5] = var11;
  153.                this.apdu[6] = var10;
  154.             }
  155.          } else if (var8 == 0) {
  156.             if (var7 <= 255) {
  157.                this.apdu = new byte[5 + var7];
  158.                this.setHeader(var1, var2, var3, var4);
  159.                this.apdu[4] = (byte)var7;
  160.                this.dataOffset = 5;
  161.                System.arraycopy(var5, var6, this.apdu, 5, var7);
  162.             } else {
  163.                this.apdu = new byte[7 + var7];
  164.                this.setHeader(var1, var2, var3, var4);
  165.                this.apdu[4] = 0;
  166.                this.apdu[5] = (byte)(var7 >> 8);
  167.                this.apdu[6] = (byte)var7;
  168.                this.dataOffset = 7;
  169.                System.arraycopy(var5, var6, this.apdu, 7, var7);
  170.             }
  171.          } else if (var7 <= 255 && var8 <= 256) {
  172.             this.apdu = new byte[6 + var7];
  173.             this.setHeader(var1, var2, var3, var4);
  174.             this.apdu[4] = (byte)var7;
  175.             this.dataOffset = 5;
  176.             System.arraycopy(var5, var6, this.apdu, 5, var7);
  177.             this.apdu[this.apdu.length - 1] = var8 != 256 ? (byte)var8 : 0;
  178.          } else {
  179.             this.apdu = new byte[9 + var7];
  180.             this.setHeader(var1, var2, var3, var4);
  181.             this.apdu[4] = 0;
  182.             this.apdu[5] = (byte)(var7 >> 8);
  183.             this.apdu[6] = (byte)var7;
  184.             this.dataOffset = 7;
  185.             System.arraycopy(var5, var6, this.apdu, 7, var7);
  186.             if (var8 != 65536) {
  187.                int var12 = this.apdu.length - 2;
  188.                this.apdu[var12] = (byte)(var8 >> 8);
  189.                this.apdu[var12 + 1] = (byte)var8;
  190.             }
  191.          }
  192.  
  193.       }
  194.    }
  195.  
  196.    private void setHeader(int var1, int var2, int var3, int var4) {
  197.       this.apdu[0] = (byte)var1;
  198.       this.apdu[1] = (byte)var2;
  199.       this.apdu[2] = (byte)var3;
  200.       this.apdu[3] = (byte)var4;
  201.    }
  202.  
  203.    public int getCLA() {
  204.       return this.apdu[0] & 255;
  205.    }
  206.  
  207.    public int getINS() {
  208.       return this.apdu[1] & 255;
  209.    }
  210.  
  211.    public int getP1() {
  212.       return this.apdu[2] & 255;
  213.    }
  214.  
  215.    public int getP2() {
  216.       return this.apdu[3] & 255;
  217.    }
  218.  
  219.    public int getNc() {
  220.       return this.field_0;
  221.    }
  222.  
  223.    public byte[] getData() {
  224.       byte[] var1 = new byte[this.field_0];
  225.       System.arraycopy(this.apdu, this.dataOffset, var1, 0, this.field_0);
  226.       return var1;
  227.    }
  228.  
  229.    public int getNe() {
  230.       return this.field_1;
  231.    }
  232.  
  233.    public byte[] getBytes() {
  234.       return (byte[])this.apdu.clone();
  235.    }
  236.  
  237.    public String toString() {
  238.       return "CommmandAPDU: " + this.apdu.length + " bytes, nc=" + this.field_0 + ", ne=" + this.field_1;
  239.    }
  240.  
  241.    public boolean equals(Object var1) {
  242.       if (this == var1) {
  243.          return true;
  244.       } else if (!(var1 instanceof CommandAPDU)) {
  245.          return false;
  246.       } else {
  247.          CommandAPDU var2 = (CommandAPDU)var1;
  248.          return Arrays.equals(this.apdu, var2.apdu);
  249.       }
  250.    }
  251.  
  252.    public int hashCode() {
  253.       return Arrays.hashCode(this.apdu);
  254.    }
  255.  
  256.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  257.       this.apdu = (byte[])var1.readUnshared();
  258.       this.parse();
  259.    }
  260. }
  261.